package com.demo.java.OD101_150.OD102;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【用户调度问题】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145691918
 */
public class OdMain {

    /**
     * 处理输入的列表，选择符合条件的最小数字，并输出它们的总和。
     *
     * @param lists 输入的二维列表，每个列表包含 3 个整数
     */
    public static void solve(List<List<Integer>> lists) {
        // 如果传入的列表为空，输出错误信息并返回
        if (lists == null) {
            System.out.println("input error");
            return;
        }

        // 初始化变量
        int start = -1;  // 用来记录上一轮选择的索引
        int sum = 0;     // 记录选出的最小值的总和

        // 遍历每一行列表
        for (int i = 0; i < lists.size(); ++i) {
            List<Integer> myList = lists.get(i);  // 获取当前列表
            int minValue = Integer.MAX_VALUE;  // 初始化最小值为最大整数

            // 如果是第一次选择（i == 0），直接选择当前行的最小值
            if (i == 0) {
                for (int j = 0; j < 3; j++) {  // 遍历当前行的3个数字
                    // 找到最小值
                    if (minValue >= myList.get(j)) {
                        minValue = myList.get(j);
                        start = j;  // 记录最小值的索引
                    }
                }
            } else {
                // 如果是后续行，选择最小值，但不能选择与上一次相同位置的数字
                int temp = 0;  // 用来记录新的最小值的位置
                for (int j = 0; j < 3; j++) {
                    // 选择最小值，但排除掉与上次选择相同位置的数字
                    if (minValue >= myList.get(j) && j != start) {
                        minValue = myList.get(j);
                        temp = j;  // 记录新选择的位置
                    }
                }
                start = temp;  // 更新为新的位置
            }

            sum += minValue;  // 将选出的最小值加入总和
        }

        // 输出总和
        System.out.println(sum);
    }

    /**
     * 程序入口，读取输入并调用 solve 方法处理
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        try {
            // 创建 Scanner 对象，读取用户输入
            Scanner s = new Scanner(System.in);

            // 读取输入的列表数量
            int number = Integer.parseInt(s.nextLine());

            // 创建一个二维列表，用来存储所有输入的列表
            List<List<Integer>> allLists = new ArrayList<>();

            // 读取每行输入，解析并存入 allLists
            for (int i = 0; i < number; ++i) {
                // 读取一行数字，并拆分成数组
                String[] value = s.nextLine().split(" ");

                // 创建一个新列表，将当前行的数字加入其中
                List<Integer> myList = new ArrayList<>();
                for (int j = 0; j < 3; ++j) {
                    myList.add(Integer.parseInt(value[j]));  // 解析数字并加入列表
                }
                allLists.add(myList);  // 将当前列表加入到二维列表 allLists
            }

            // 调用 solve 方法处理输入的所有列表
            solve(allLists);
        } catch (Exception e) {
            // 捕获异常并输出错误信息
            e.printStackTrace();
            System.out.println("input error");
        }
    }
}